
/** 判断字符串是否只包含数字与空格 */
const isDigitAndBlankSpaceOnly = (str) => {
    // ^：这个符号表示匹配字符串的开始。在这个表达式中，它指示正则表达式从字符串的开头开始匹配。
    // [0-9\s]：这个是一个字符集，表示匹配数字（0到9之间的任何数字）或空格。
    // 在正则表达式中，方括号 [ ] 表示一个字符集，其中包含了你想要匹配的字符的范围。0-9 表示匹配任何数字，
    // 而 \s 表示匹配任何空白字符，包括空格、制表符和换行符等。
    // +：这个符号表示匹配前面的字符集一次或多次。在这个表达式中，它指示匹配一个或多个数字或空格。
    // $：这个符号表示匹配字符串的结束。在这个表达式中，它指示正则表达式匹配到字符串的结尾。
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^[0-9\s]+$/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};


/** 判断字符串是否是 数字- 格式开头 */
const isDigitAndLineStartOnly = (str) => {
    // ^：这个符号表示匹配字符串的开始。在这个表达式中，它指示正则表达式从字符串的开头开始匹配。
    // ^ 表示匹配字符串的开始位置。
    // \d 表示匹配一个数字。
    // + 表示匹配前面的表达式一次或多次。
    // - 表示匹配一个连字符。
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^\d+-/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};


/** 判断字符串是否是 肯尼亚金额格式 */
const isKenyaAmountFormat = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    const regex = /^[+-].*KSH\..*$/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 肯尼亚流水id格式 */
const isKenyaBillIDFormat = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^ID:.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 肯尼亚流水fee格式 */
const isKenyaBillFeeFormat = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    // let regex = /^FEE KSH.*/;
    let regex = /^FEE.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 dd:dd 格式 */
const isDateHHMMFormat = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /\d{2}:\d{2}/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 dd*dd 格式 */
const isPhoneEncrptFormat = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^[0-9][0-9*]*[0-9]$/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否包含 Transaction ID 与数字 */
const isTransactionIDFormatAirtelUgx = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /Transaction ID.*\d+.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 加纳momo收款短信 */
const isSmsFormatMomoPaymentReceived = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    if (str.indexOf("Payment received for GHS") !== -1) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 加纳momo放款短信 */
const isSmsFormatMomoPaymentSend = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    if (str.indexOf("Payment made for GHS") !== -1) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 加纳vodafone收款短信 */
const isSmsFormatVodafonePaymentReceived = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^\d+ Confirmed.*You have received GHS.*Your.*balance is GHS.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 加纳vodafone放款短信 */
const isSmsFormatVodafonePaymentSend = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^\d+ Confirmed.*GHS.*sent to.*Your.*balance is GHS.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 赞比亚airtel收款短信 */
const isSmsFormatZmwAirtelPaymentReceived = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^\d+ Confirmed.*You have received GHS.*Your Vodafone Cash balance is GHS.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

/** 判断字符串是否是 赞比亚airtel放款短信 */
const isSmsFormatZmwAirtelPaymentSend = (str) => {
    if ((!str) || (str.length === 0)) {
        return false;
    }
    let regex = /^\d+ Confirmed.*GHS.*sent to.*Your Vodafone Cash balance is GHS.*/;
    if (regex.test(str)) {
        return true;
    }
    return false;
};

const toMD5 = (input) => {
    function md5cycle(x, k) {
        let a = x[0], b = x[1], c = x[2], d = x[3];

        a = ff(a, b, c, d, k[0], 7, -680876936);
        d = ff(d, a, b, c, k[1], 12, -389564586);
        c = ff(c, d, a, b, k[2], 17, 606105819);
        b = ff(b, c, d, a, k[3], 22, -1044525330);
        a = ff(a, b, c, d, k[4], 7, -176418897);
        d = ff(d, a, b, c, k[5], 12, 1200080426);
        c = ff(c, d, a, b, k[6], 17, -1473231341);
        b = ff(b, c, d, a, k[7], 22, -45705983);
        a = ff(a, b, c, d, k[8], 7, 1770035416);
        d = ff(d, a, b, c, k[9], 12, -1958414417);
        c = ff(c, d, a, b, k[10], 17, -42063);
        b = ff(b, c, d, a, k[11], 22, -1990404162);
        a = ff(a, b, c, d, k[12], 7, 1804603682);
        d = ff(d, a, b, c, k[13], 12, -40341101);
        c = ff(c, d, a, b, k[14], 17, -1502002290);
        b = ff(b, c, d, a, k[15], 22, 1236535329);

        a = gg(a, b, c, d, k[1], 5, -165796510);
        d = gg(d, a, b, c, k[6], 9, -1069501632);
        c = gg(c, d, a, b, k[11], 14, 643717713);
        b = gg(b, c, d, a, k[0], 20, -373897302);
        a = gg(a, b, c, d, k[5], 5, -701558691);
        d = gg(d, a, b, c, k[10], 9, 38016083);
        c = gg(c, d, a, b, k[15], 14, -660478335);
        b = gg(b, c, d, a, k[4], 20, -405537848);
        a = gg(a, b, c, d, k[9], 5, 568446438);
        d = gg(d, a, b, c, k[14], 9, -1019803690);
        c = gg(c, d, a, b, k[3], 14, -187363961);
        b = gg(b, c, d, a, k[8], 20, 1163531501);
        a = gg(a, b, c, d, k[13], 5, -1444681467);
        d = gg(d, a, b, c, k[2], 9, -51403784);
        c = gg(c, d, a, b, k[7], 14, 1735328473);
        b = gg(b, c, d, a, k[12], 20, -1926607734);

        a = hh(a, b, c, d, k[5], 4, -378558);
        d = hh(d, a, b, c, k[8], 11, -2022574463);
        c = hh(c, d, a, b, k[11], 16, 1839030562);
        b = hh(b, c, d, a, k[14], 23, -35309556);
        a = hh(a, b, c, d, k[1], 4, -1530992060);
        d = hh(d, a, b, c, k[4], 11, 1272893353);
        c = hh(c, d, a, b, k[7], 16, -155497632);
        b = hh(b, c, d, a, k[10], 23, -1094730640);
        a = hh(a, b, c, d, k[13], 4, 681279174);
        d = hh(d, a, b, c, k[0], 11, -358537222);
        c = hh(c, d, a, b, k[3], 16, -722521979);
        b = hh(b, c, d, a, k[6], 23, 76029189);
        a = hh(a, b, c, d, k[9], 4, -640364487);
        d = hh(d, a, b, c, k[12], 11, -421815835);
        c = hh(c, d, a, b, k[15], 16, 530742520);
        b = hh(b, c, d, a, k[2], 23, -995338651);

        a = ii(a, b, c, d, k[0], 6, -198630844);
        d = ii(d, a, b, c, k[7], 10, 1126891415);
        c = ii(c, d, a, b, k[14], 15, -1416354905);
        b = ii(b, c, d, a, k[5], 21, -57434055);
        a = ii(a, b, c, d, k[12], 6, 1700485571);
        d = ii(d, a, b, c, k[3], 10, -1894986606);
        c = ii(c, d, a, b, k[10], 15, -1051523);
        b = ii(b, c, d, a, k[1], 21, -2054922799);
        a = ii(a, b, c, d, k[8], 6, 1873313359);
        d = ii(d, a, b, c, k[15], 10, -30611744);
        c = ii(c, d, a, b, k[6], 15, -1560198380);
        b = ii(b, c, d, a, k[13], 21, 1309151649);
        a = ii(a, b, c, d, k[4], 6, -145523070);
        d = ii(d, a, b, c, k[11], 10, -1120210379);
        c = ii(c, d, a, b, k[2], 15, 718787259);
        b = ii(b, c, d, a, k[9], 21, -343485551);

        x[0] = add32(a, x[0]);
        x[1] = add32(b, x[1]);
        x[2] = add32(c, x[2]);
        x[3] = add32(d, x[3]);
    }

    function cmn(q, a, b, x, s, t) {
        a = add32(add32(a, q), add32(x, t));
        return add32((a << s) | (a >>> (32 - s)), b);
    }

    function ff(a, b, c, d, x, s, t) {
        return cmn((b & c) | (~b & d), a, b, x, s, t);
    }

    function gg(a, b, c, d, x, s, t) {
        return cmn((b & d) | (c & ~d), a, b, x, s, t);
    }

    function hh(a, b, c, d, x, s, t) {
        return cmn(b ^ c ^ d, a, b, x, s, t);
    }

    function ii(a, b, c, d, x, s, t) {
        return cmn(c ^ (b | ~d), a, b, x, s, t);
    }

    function md51(s) {
        let txt = '',
            n = s.length,
            state = [1732584193, -271733879, -1732584194, 271733878],
            i;

        for (i = 64; i <= n; i += 64) {
            md5cycle(state, md5blk(s.substring(i - 64, i)));
        }

        s = s.substring(i - 64);
        let tail = Array(16).fill(0);

        for (i = 0; i < s.length; i++) {
            tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
        }

        tail[i >> 2] |= 0x80 << ((i % 4) << 3);

        if (i > 55) {
            md5cycle(state, tail);
            tail.fill(0);
        }

        tail[14] = n * 8;
        md5cycle(state, tail);

        return state;
    }

    function md5blk(s) {
        let md5blk = [];
        for (let i = 0; i < 64; i += 4) {
            md5blk[i >> 2] =
                s.charCodeAt(i) +
                (s.charCodeAt(i + 1) << 8) +
                (s.charCodeAt(i + 2) << 16) +
                (s.charCodeAt(i + 3) << 24);
        }

        return md5blk;
    }

    function rhex(n) {
        let s = '',
            j;
        for (j = 0; j < 4; j++) {
            s +=
                '0123456789abcdef'.charAt((n >> (j * 8 + 4)) & 0x0f) +
                '0123456789abcdef'.charAt((n >> (j * 8)) & 0x0f);
        }

        return s;
    }

    function hex(s) {
        return s.map(rhex).join('');
    }

    function add32(a, b) {
        return (a + b) & 0xffffffff;
    }

    if (md51('hello') != '5d41402abc4b2a76b9719d911017c592') {
        add32 = function (x, y) {
            let lsw = (x & 0xffff) + (y & 0xffff);
            let msw = (x >> 16) + (y >> 16) + (lsw >> 16);
            return (msw << 16) | (lsw & 0xffff);
        };
    }

    return hex(md51(input));
}

module.exports = {

    /** 判断字符串是否只包含数字与空格*/
    isDigitAndBlankSpaceOnly: isDigitAndBlankSpaceOnly,
    /** 判断字符串是否是 数字- 格式开头*/
    isDigitAndLineStartOnly: isDigitAndLineStartOnly,

    /** 判断字符串是否是 肯尼亚金额格式 */
    isKenyaAmountFormat: isKenyaAmountFormat,

    /** 判断字符串是否是 肯尼亚流水id格式 */
    isKenyaBillIDFormat: isKenyaBillIDFormat,

    /** 判断字符串是否是 肯尼亚流水fee格式 */
    isKenyaBillFeeFormat: isKenyaBillFeeFormat,

    /** 判断字符串是否是 dd:dd 格式 */
    isDateHHMMFormat: isDateHHMMFormat,

    /** 判断字符串是否是 dd*dd 格式 */
    isPhoneEncrptFormat: isPhoneEncrptFormat,

    /** 判断字符串是否是 加纳momo收款短信 */
    isSmsFormatMomoPaymentReceived: isSmsFormatMomoPaymentReceived,

    /** 判断字符串是否是 加纳momo放款短信 */
    isSmsFormatMomoPaymentSend: isSmsFormatMomoPaymentSend,

    /** 判断字符串是否是 加纳vodafone收款短信 */
    isSmsFormatVodafonePaymentReceived: isSmsFormatVodafonePaymentReceived,

    /** 判断字符串是否是 加纳vodafone放款短信 */
    isSmsFormatVodafonePaymentSend: isSmsFormatVodafonePaymentSend,

    /** 判断字符串是否是 赞比亚airtel收款短信 */
    isSmsFormatZmwAirtelPaymentReceived: isSmsFormatZmwAirtelPaymentReceived,

    /** 判断字符串是否是 赞比亚airtel放款短信 */
    isSmsFormatZmwAirtelPaymentSend: isSmsFormatZmwAirtelPaymentSend,

    /** 判断字符串是否包含 Transaction ID 与数字 */
    isTransactionIDFormatAirtelUgx: isTransactionIDFormatAirtelUgx,

    /** 转md5 */
    toMD5:toMD5
};